package com.smart.community.payment.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.result.PageResult;
import com.smart.community.payment.dto.PaymentDTO;
import com.smart.community.payment.entity.Payment;
import com.smart.community.payment.vo.PaymentVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 支付服务接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
public interface IPaymentService extends IService<Payment> {

    /**
     * 创建支付订单
     * 
     * @param paymentDTO 支付信息
     * @return 支付订单
     * @throws Exception 异常
     */
    Payment createPayment(PaymentDTO paymentDTO) throws Exception;

    /**
     * 分页查询支付记录
     * 
     * @param paymentDTO 查询条件
     * @return 分页结果
     * @throws Exception 异常
     */
    PageResult<PaymentVO> pagePayments(PaymentDTO paymentDTO) throws Exception;

    /**
     * 根据ID查询支付详情
     * 
     * @param paymentId 支付ID
     * @return 支付详情
     * @throws Exception 异常
     */
    PaymentVO getPaymentDetail(Long paymentId) throws Exception;

    /**
     * 根据订单号查询支付详情
     * 
     * @param orderNo 订单号
     * @return 支付详情
     * @throws Exception 异常
     */
    PaymentVO getPaymentByOrderNo(String orderNo) throws Exception;

    /**
     * 根据用户ID查询支付记录
     * 
     * @param userId 用户ID
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByUserId(Long userId) throws Exception;

    /**
     * 根据社区ID查询支付记录
     * 
     * @param communityId 社区ID
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByCommunityId(Long communityId) throws Exception;

    /**
     * 更新支付状态
     * 
     * @param paymentId 支付ID
     * @param paymentStatus 支付状态
     * @return 更新结果
     * @throws Exception 异常
     */
    boolean updatePaymentStatus(Long paymentId, Integer paymentStatus) throws Exception;

    /**
     * 取消支付订单
     * 
     * @param paymentId 支付ID
     * @param reason 取消原因
     * @return 取消结果
     * @throws Exception 异常
     */
    boolean cancelPayment(Long paymentId, String reason) throws Exception;

    /**
     * 重新支付
     * 
     * @param paymentId 支付ID
     * @param paymentMethod 支付方式
     * @return 重新支付结果
     * @throws Exception 异常
     */
    PaymentVO repayPayment(Long paymentId, Integer paymentMethod) throws Exception;

    /**
     * 处理支付成功回调
     * 
     * @param orderNo 订单号
     * @param thirdPartyOrderNo 第三方订单号
     * @param channelCode 支付渠道编码
     * @return 处理结果
     * @throws Exception 异常
     */
    boolean handlePaymentSuccess(String orderNo, String thirdPartyOrderNo, String channelCode) throws Exception;

    /**
     * 处理支付失败回调
     * 
     * @param orderNo 订单号
     * @param failureReason 失败原因
     * @return 处理结果
     * @throws Exception 异常
     */
    boolean handlePaymentFailure(String orderNo, String failureReason) throws Exception;

    /**
     * 申请退款
     * 
     * @param paymentId 支付ID
     * @param refundAmount 退款金额
     * @param refundReason 退款原因
     * @return 退款结果
     * @throws Exception 异常
     */
    boolean applyRefund(Long paymentId, BigDecimal refundAmount, String refundReason) throws Exception;

    /**
     * 处理退款成功回调
     * 
     * @param orderNo 订单号
     * @param refundOrderNo 退款订单号
     * @return 处理结果
     * @throws Exception 异常
     */
    boolean handleRefundSuccess(String orderNo, String refundOrderNo) throws Exception;

    /**
     * 处理退款失败回调
     * 
     * @param orderNo 订单号
     * @param failureReason 失败原因
     * @return 处理结果
     * @throws Exception 异常
     */
    boolean handleRefundFailure(String orderNo, String failureReason) throws Exception;

    /**
     * 更新第三方支付信息
     * 
     * @param paymentId 支付ID
     * @param thirdPartyOrderNo 第三方订单号
     * @param channelCode 渠道编码
     * @return 更新结果
     * @throws Exception 异常
     */
    boolean updateThirdPartyInfo(Long paymentId, String thirdPartyOrderNo, String channelCode) throws Exception;

    /**
     * 根据支付状态查询支付记录
     * 
     * @param paymentStatus 支付状态
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByStatus(Integer paymentStatus) throws Exception;

    /**
     * 根据支付方式查询支付记录
     * 
     * @param paymentMethod 支付方式
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByMethod(Integer paymentMethod) throws Exception;

    /**
     * 查询指定时间范围内的支付记录
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByTimeRange(LocalDateTime startTime, LocalDateTime endTime) throws Exception;

    /**
     * 根据业务类型和业务订单ID查询支付记录
     * 
     * @param businessType 业务类型
     * @param businessOrderId 业务订单ID
     * @return 支付记录列表
     * @throws Exception 异常
     */
    List<PaymentVO> getPaymentsByBusinessOrder(Integer businessType, Long businessOrderId) throws Exception;

    /**
     * 统计用户支付总额
     * 
     * @param userId 用户ID
     * @return 支付总额
     * @throws Exception 异常
     */
    BigDecimal sumAmountByUserId(Long userId) throws Exception;

    /**
     * 统计社区支付总额
     * 
     * @param communityId 社区ID
     * @return 支付总额
     * @throws Exception 异常
     */
    BigDecimal sumAmountByCommunityId(Long communityId) throws Exception;

    /**
     * 统计指定时间范围内的支付总额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 支付总额
     * @throws Exception 异常
     */
    BigDecimal sumAmountByTimeRange(LocalDateTime startTime, LocalDateTime endTime) throws Exception;

    /**
     * 统计各支付方式的支付金额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     * @throws Exception 异常
     */
    List<Map<String, Object>> sumAmountByPaymentMethod(LocalDateTime startTime, LocalDateTime endTime) throws Exception;

    /**
     * 统计各业务类型的支付金额
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     * @throws Exception 异常
     */
    List<Map<String, Object>> sumAmountByBusinessType(LocalDateTime startTime, LocalDateTime endTime) throws Exception;

    /**
     * 统计各支付状态的记录数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     * @throws Exception 异常
     */
    List<Map<String, Object>> countByPaymentStatus(LocalDateTime startTime, LocalDateTime endTime) throws Exception;

    /**
     * 统计每日支付金额趋势
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     * @throws Exception 异常
     */
    List<Map<String, Object>> getDailyPaymentTrend(LocalDateTime startDate, LocalDateTime endDate) throws Exception;

    /**
     * 统计每月支付金额趋势
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     * @throws Exception 异常
     */
    List<Map<String, Object>> getMonthlyPaymentTrend(LocalDateTime startDate, LocalDateTime endDate) throws Exception;

    /**
     * 获取支付统计概览
     * 
     * @param communityId 社区ID
     * @return 统计概览
     * @throws Exception 异常
     */
    Map<String, Object> getPaymentOverview(Long communityId) throws Exception;

    /**
     * 统计今日支付金额
     * 
     * @param communityId 社区ID
     * @return 今日支付金额
     * @throws Exception 异常
     */
    BigDecimal sumTodayPaymentAmount(Long communityId) throws Exception;

    /**
     * 统计本月支付金额
     * 
     * @param communityId 社区ID
     * @return 本月支付金额
     * @throws Exception 异常
     */
    BigDecimal sumMonthPaymentAmount(Long communityId) throws Exception;

    /**
     * 统计待处理支付数量
     * 
     * @param communityId 社区ID
     * @return 待处理数量
     * @throws Exception 异常
     */
    int countPendingPayments(Long communityId) throws Exception;

    /**
     * 批量删除支付记录
     * 
     * @param paymentIds 支付ID列表
     * @return 删除结果
     * @throws Exception 异常
     */
    Map<String, Integer> batchDeletePayments(List<Long> paymentIds) throws Exception;

    /**
     * 清除过期支付记录
     * 
     * @param expireTime 过期时间
     * @return 清除数量
     * @throws Exception 异常
     */
    int clearExpiredPayments(LocalDateTime expireTime) throws Exception;

    /**
     * 清除支付缓存
     * 
     * @param communityId 社区ID
     * @throws Exception 异常
     */
    void clearPaymentCache(Long communityId) throws Exception;

    /**
     * 清除用户支付缓存
     * 
     * @param userId 用户ID
     * @throws Exception 异常
     */
    void clearUserPaymentCache(Long userId) throws Exception;

    /**
     * 导出支付数据
     * 
     * @param paymentDTO 导出条件
     * @return 导出结果
     * @throws Exception 异常
     */
    String exportPayments(PaymentDTO paymentDTO) throws Exception;

    /**
     * 导出统计报表
     * 
     * @param communityId 社区ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 导出结果
     * @throws Exception 异常
     */
    String exportStatisticsReport(Long communityId, LocalDateTime startDate, LocalDateTime endDate) throws Exception;
}
